今天來分享一個小技巧~
當我們對下方三支路由請求時,如果所帶的 id 在資料庫內不存在(請求不存在資源時),常常會造成 Exception 拋出~
Route::get('books/{id}', 'BookController@show');
Route::put('books/{id}', 'BookController@update');
Route::delete('books/{id}', 'BookController@destroy');
[Tips] 利用 Eloquent 的 findOrFail 方法可以順利讓函式在搜尋不到資料時拋出 ModelNotFoundException
我們先來試試修改這支 API ( GET api/books/{id} )
修改 BookController.php 內的 show 方法
public function show($id)
{
$book = Book::findOrFail($id);
return $book;
}
當我們對一個不存在的資源請求時:
發現其實是一個錯誤回傳的頁面,但這不是我們要的~開發 API 所需要回傳的錯誤應該是 json 格式。
那我們要如何攔截例外並讓他以 json 的格式回傳給我們呢?
方法 1. 在 Controller 內以添加 try-catch 的方式攔截例外
use Illuminate\Database\Eloquent\ModelNotFoundException;
public function show($id)
{
try {
$book = Book::findOrFail($id);
} catch (ModelNotFoundException $th) {
return response()->json(['資源不存在'], 404);
}
return $book;
}
這樣似乎能夠成功解決問題,但如果每次要做錯誤攔截都要在 function 加上 try-catch 感覺就很繁瑣。
沒關係我們還有其他招數:
方法 2. 透過 Handler 來全局響應
在 app/Exceptions/Handler.php 下的 render function 內加入
public function render($request, Exception $exception)
{
if ($exception instanceof ModelNotFoundException) {
// 回傳資源時 使用 Model::findOrFail 找不到資源時統一回傳
return response()->json('資源不存在', 404);
}
return parent::render($request, $exception);
}
此時我們的 BookController 就能保持乾淨整潔啦!
public function show($id)
{
$book = Book::findOrFail($id);
return $book;
}
透過方法二可以快速解決 API 存取不存在資源時的 Json 響應回傳!
明天見拉~~